package cn.lavender.crypto.asymmetric;

import cn.hutool.crypto.SecureUtil;
import cn.hutool.crypto.asymmetric.KeyType;
import cn.hutool.crypto.asymmetric.RSA;
import org.apache.tomcat.util.codec.binary.Base64;

/**
 * <p>
 * 非对称算法：RSA
 * </p>
 *
 * 签名：使用私钥加密，公钥解密。用于让所有公钥所有者验证私钥所有者的身份并且用来防止私钥所有者发布的内容被篡改，但是不用来保证内容不被他人获得。
 * 加密：用公钥加密，私钥解密。用于向公钥所有者发布信息,这个信息可能被他人篡改,但是无法被他人获得。
 *
 * @author: zhu.chen
 * @date: 2021/3/20
 * @version: v1.0.0
 */
public class RsaCrypto {

    private static final RSA RSA = SecureUtil.rsa();

    /**
     * 加密：公钥加密
     *
     * @param data
     * @return
     */
    public static String encrypt(String data) {
        return Base64.encodeBase64String(RSA.encrypt(data,  KeyType.PublicKey));
    }

    /**
     * 解密：私钥解密
     * @param cipher
     * @return
     */
    public static String decrypt(String cipher) {
        return new String(RSA.decrypt(Base64.decodeBase64(cipher), KeyType.PrivateKey));
    }

    /**
     * 签名：私钥加密
     *
     * @param data
     * @return
     */
    public static String signature(String data) {
        return Base64.encodeBase64String(RSA.encrypt(data,  KeyType.PrivateKey));
    }

    /**
     * 解密：公钥解密
     * @param cipher
     * @return
     */
    public static String attestation(String cipher) {
        return new String(RSA.decrypt(Base64.decodeBase64(cipher), KeyType.PublicKey));
    }

    public static void main(String[] args) {
        String cipher = RsaCrypto.encrypt("小明");
        System.out.println(cipher);
        System.out.println(RsaCrypto.decrypt(cipher));

        String cipher1 = RsaCrypto.signature("小明");
        System.out.println(cipher1);
        System.out.println(RsaCrypto.attestation(cipher1));
    }

}
